/*
 *
 *
 */

package steg.gui.steg;

import java.awt.Frame;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import steg.steki.StegException;
import steg.steki.bmp.PlikBMP;
import steg.steki.png.PlikPNG;
import steg.utils.MyFileFilter;

/**
 *
 * @author 
 */
public class JDialogPlikPNG extends JDialogPlik {


// ------------------------------- ZIENNE PRYWATNE -----------------------------
    //-- stałe
    //-- czy
    //-- zmienne
    private File temppng;
    private File tempbmp;

// ------------------------------- ZIENNE PUBLICZNE
    //-- czy
    //-- zmienne

// ------------------------------- KONSTRUKTORY
    public JDialogPlikPNG( Frame owner, boolean modal){
        super(owner, "", modal);
        initTilte("PNG steganografia");
        initPlikIcon("png64.png");
        initStartOpcje();

    }

// ******************************** PUBLICZNE **********************************
// *****************************************************************************
// ------------------------------- FUNKCJE KRYTYCZNE ---------------------------
    @Override
    protected void steganuj(String nazwa) {
        try {

            sekret.setSecretAsText( czyText() );
            sekret.setBitowNaSample( getBitowNaSample() );
            sekret.setZnacznik( czyTag());
            sekret.setCzyZip( czyGZIP());
            sekret.setCzyHaslo( czyHaslo());
            if(sekret.isCzyHaslo())
                sekret.setSekretHaslo( getHaslo());

            // tym razem nazwa inna, nazwa temp
            String temp = plikStegowany.getFile().getPath();
            temp = temp.substring(0 , temp.lastIndexOf( File.separator))+File.separator+"temp";
            tempbmp =  new File( nazwa );

            plikStegowany.steg( tempbmp, sekret);


        } catch (StegException ex) {

                raportError(ex,ERROR_INNY,"Błąd podczas steganografii PNG");
                JOptionPane.showMessageDialog(this,ex.getStegMassage(), "Błąd steganograficzny.",
                    JOptionPane.ERROR_MESSAGE);
        } catch (IOException ex) {

                raportError(ex,ERROR_INNY,"Błąd podczas steganografii PNG");
                JOptionPane.showMessageDialog(this, "Nieznany błąd podczas próby stganografi.\n","Błąd steganograficzny.",
                    JOptionPane.ERROR_MESSAGE);
        }

    }

    @Override
    protected void loadStegPlik() {

        // a. wczytaj plik
        JFileChooser chooser = new JFileChooser();
        MyFileFilter mff = new MyFileFilter();
        mff.setExtencion(".png");

        chooser.addChoosableFileFilter(mff);
        chooser.setCurrentDirectory(new File(PATH_LST_OPEN));

        int returnVal = chooser.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {

            try {

                File plik = chooser.getSelectedFile();
                PATH_LST_OPEN = plik.getPath();


                // 0 sztuczka dla PNG :P ale cicho sza !

                //zucenie pliku do PNG celem sprawdzenia czy jest to PNG
                plikStegowany = new PlikPNG();
                temppng = new File(PATH_LST_OPEN);
                plikStegowany.init(temppng);
                this.setMetaDane(plikStegowany.getMetaDane());

                // jesli nie bylo bledu, to teraz sztuczka
                String temp = PATH_LST_OPEN;
                temp = temp.substring(0 , temp.lastIndexOf( File.separator))+File.separator+"temp.temp";
                File tempf = new File(temp);

                //1 zamiana PNG na BMP
                ImageIO.write(ImageIO.read( plikStegowany.getFile() ) , "bmp", tempf);

                //teraz mamy BMP, można steganowac
                plikStegowany = new PlikBMP();
                plikStegowany.init( tempf);



            } catch (StegException ex) {
                raportError(ex, ERROR_STEG_PLIK,"błąd stg PNG");
                JOptionPane.showMessageDialog(this, ex.getStegMassage(),"Błąd steganografizcny",
                        JOptionPane.ERROR_MESSAGE);

            } catch (IOException ex) {
                raportError(ex,ERROR_STEG_PLIK,"bład wczytu PNG");
                JOptionPane.showMessageDialog(this, "Błąd wczytania pliku.\nplik("+PATH_LST_OPEN+")","Błąd!",
                        JOptionPane.ERROR_MESSAGE);

            } catch (Exception ex) {
                //error nie znany, lepiej wypłapywać wszystko, potem można jak co czeknąć co jest 5
                raportError(ex,ERROR_STEG_PLIK,"bład przy wczytywaniu PNG");
                JOptionPane.showMessageDialog(this, "Błąd wczytania pliku.\nplik("+PATH_LST_OPEN+")","Nieznany błąd!",
                        JOptionPane.ERROR_MESSAGE);

            }
        }
    }
// ------------------------------- FUNKCJE DODATKOWE ---------------------------
    @Override
    protected void initStartOpcje() {
        super.setIsGZIP(true, true, true);
        super.setIsHaslo(true, true, false);
        super.setIsTag(true, true, true);
    }

    @Override
    protected void zakoncz() {
        // png trzeba odzyskac z pliku temp

        try {
            // nazwa pliku, dziala to tak cos.exe ->> cos.PLIK_STEG_EXTENCION.exe
            String nazwa = temppng.getAbsolutePath();
            if(nazwa.indexOf(".")==-1)nazwa += ".steg"; // jkesli ni ma roszerzenia, bo durny error bedzie
            String[] nazwaT = nazwa.split("\\.");
            nazwa = (nazwaT[nazwaT.length-2] + PLIK_STEG_EXTENCION + nazwaT[nazwaT.length-1]);

            ImageIO.write( ImageIO.read( tempbmp ), "png", new File(nazwa));

        } catch (IOException ex) {
            raportError(ex,ERROR_INNY,"Błąd zapisu z bmp -> png");
            JOptionPane.showMessageDialog(this,"Nieudało się stworzyć pliku PNG", "Błąd,.",
                JOptionPane.ERROR_MESSAGE);
        }

    }

    /**
    * @param args the command line arguments
    */
    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {

        try
        {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName() );
        }
        catch(Exception e)
        {
            throw new RuntimeException(e);
        }

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                JDialogPlikPNG dialog = new JDialogPlikPNG(new Frame(), true);
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                    @Override
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });

    }
// ------------------------------- FUNKCJE dziwne ------------------------------



// ******************************** PRYWATNE ***********************************
// *****************************************************************************
// ------------------------------- FUNKCJE KRYTYCZNE


// ------------------------------- FUNKCJE  POMOCNICZE CZY/SET -----------------


}
